package br.gov.sjc.export;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
import android.content.Intent;
import br.gov.sjc.socialalimenta.R;
import br.gov.sjc.socialalimenta.SocialAlimenta2Activity;
import br.org.sjc.validacao.Sair;

//
public class EnviarArquivoFTP extends Sair implements OnClickListener,Runnable {
	private static String TAG = "EnviarArquivoFTP";
	private static String file = "/data/data/br.gov.sjc.socialalimenta/files/socialAlimenta.xml";
	private ProgressDialog dialog;
	private ProgressDialog progressDialog;
	//private Handler handler = new Handler();
	FTPClient ftp = new FTPClient();
	TextView notificacao;
	boolean retorno = false;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.enviararquivoftp);
		registerBaseActivityReceiver();
		clickSemClick();

		notificacao = (TextView) findViewById(R.enviarArquivo.lblnotificacao);

		NomeArquivo na = new NomeArquivo(this);
		String NomeArquivo = "socialAlimenta-";
		//TODO: Chamando o ID = 1 (somente deve existir esse ID nessa tabela).
		NomeArquivo += na.PlacaPatrimonial(1);
		Log.i(TAG, "Nome do arquivo:"+NomeArquivo);

		//if (uploadFTP("189.38.80.49", "celebrandoavida", "9qw16chn", "socialAlimenta", 
		if (uploadFTP("10.1.30.1", "ntadm/social.alimenta", "so1234", "tablet_ftp",
				"/data/data/br.gov.sjc.socialalimenta/files/",NomeArquivo+".xml")){
			notificacao.setText("Arquivo enviado com sucesso");
			notificacao.setVisibility(View.VISIBLE);
		} else{
			notificacao.setText("Erro ao enviar arquivo");
			notificacao.setVisibility(View.VISIBLE);
		}
		Button b = (Button) findViewById(R.enviarArquivo.btnenviarFTP);
		b.setOnClickListener(this);

	}
	public void clickSemClick (){
		Log.v("clickSemClick()", "Iniciada a Função");
		//dialog = ProgressDialog.show(this, "Social Alimenta FTP 01",
		//		 "Enviando arquivo, por favor aguarde...", false, true);

		// Faz o envio do arquivo FTP.
		//new Thread(this).start();
	}
	public void onClick(View v) {
		/** InitComponents */
		Log.v("onClick()", "Botao voltar acionado");
		Intent ittEVoltar = new Intent(getApplicationContext(), SocialAlimenta2Activity.class);
		startActivity(ittEVoltar); 

	}

	public void run() {
		//EditText loginEdit = (EditText) findViewById(R.enviarArquivo.tblogin);
		//EditText senhaEdit = (EditText) findViewById(R.enviarArquivo.tbsenha);

		String login = "celebrandoavida";//loginEdit.getText().toString();
		String senha = "c.c.b.r.";//senhaEdit.getText().toString();
		String diretorio = "/data/data/br.gov.sjc.socialalimenta/files/";
		//String nomeArquivo = "socialAlimenta.txt";
		Log.v("EnviarArquivoFTP - run()", "Atribuidas as Variáveis");


		try {
			NomeArquivo na = new NomeArquivo(this);
			String NomeArquivo = "socialAlimenta-";
			//TODO: Chamando o ID = 1 (somente deve existir esse ID nessa tabela.
			NomeArquivo += na.PlacaPatrimonial(1);
			Log.i("WriteFile", "Nome do arquivo:"+NomeArquivo);
			//envioFTP(login, senha, diretorio, tempString);
			handler.post(new Runnable() {
				public void run() {
					notificacao.setText("Arquivo enviado com sucesso");
					notificacao.setVisibility(View.VISIBLE);
					Log.v("run()", "Try Executado "); 
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
			Log.e("run", "Catch Executado "+e.getMessage()); 
			notificacao.setText("=="+e.getMessage());
			notificacao.setVisibility(View.VISIBLE);
			//dialog.dismiss();
			//dialog = ProgressDialog.show(this, "Finalizado", "Finalizado Corretamente");
		}finally {
			dialog.dismiss();
			Log.v("run", "finally Executado "); 
		}
	}
	/*
	 * Load file content to String
	 */
	public static String loadFileAsString(String filePath) throws java.io.IOException{
		StringBuffer fileData = new StringBuffer(1000);
		BufferedReader reader = new BufferedReader(new FileReader(filePath));
		char[] buf = new char[1024];
		int numRead=0;
		while((numRead=reader.read(buf)) != -1){
			String readData = String.valueOf(buf, 0, numRead);
			fileData.append(readData);
		}
		reader.close();
		return fileData.toString();
	}
	final Handler dialogHandler = new Handler() {

		public void handleMessage(Message msg) {
			progressDialog = new ProgressDialog(EnviarArquivoFTP.this);
			progressDialog.setTitle("Consultando Pendencias");
			progressDialog.setMessage("Aguarde...");
			progressDialog.setIndeterminate(true);
			progressDialog.show();
		} 
	};

	final Handler handler = new Handler() { 
		public void handleMessage(Message msg) {
			progressDialog.dismiss();
			//iniciarConsulta(resourceNames);//aqui eu populo o ListView!!
		}
	};
	/*
	 * Get the STB MacAddress
	 */
	public String getMacAddress(){
		try {
			return loadFileAsString("/sys/class/net/eth0/address")
					.toUpperCase().substring(0, 17);
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 
	 * @param Arquivo
	 * @return
	 * @throws IOException 
	 * @throws SocketException 
	 */
	public boolean downloadFTP(String ipFTP, String loginFTP, String senhaFTP, 
			String diretorioFTP, String diretorioAndroid, String arquivoFTP) throws SocketException, IOException{
		boolean retorno = false;
		FileOutputStream arqReceber = null;
		//Recupera o caminho padrão do SDCARD
		//File root = Environment.getExternalStorageDirectory();
		try{

			ftp.connect(ipFTP);  
			Log.i("DownloadFTP", "Connected: "+ipFTP);
			ftp.login(loginFTP, senhaFTP);
			Log.i("DownloadFTP", "Logged on");
			ftp.enterLocalPassiveMode();  
			ftp.setFileType(FTPClient.BINARY_FILE_TYPE);  
			//arqReceber = new FileOutputStream(root+"/socialAlimenta/socialAlimenta.xml");
			arqReceber = new FileOutputStream(file.toString());
			//ftp.retrieveFile("/tablet_ftp/Novo/socialAlimenta.xml", arqReceber );
			ftp.retrieveFile(diretorioFTP.toString()+"/"+arquivoFTP.toString(), arqReceber );
			retorno = true;
			ftp.disconnect();
			Log.i("DownloadFTP", "retorno:"+retorno);

		}catch(Exception e){
			ftp.disconnect();
			Log.e("DownloadFTP", "Erro:"+e.getMessage());
		}finally{
			Log.e("DownloadFTP", "Finally");
		}
		return retorno;
	}

	/**
	 * Unico método ftp em uso atualmente
	 * @param ipFTP
	 * @param loginFTP
	 * @param senhaFTP
	 * @param diretorioFTP
	 * @param diretorioAndroid
	 * @param arquivoFTP
	 * @return
	 */
	public boolean uploadFTP(String ipFTP, String loginFTP, String senhaFTP, 
			String diretorioFTP, String diretorioAndroid, String arquivoFTP){  
		try {  
			/*dialog = ProgressDialog.show(this, "Social Alimenta FTP 02",
   				 "Enviando arquivo, por favor aguarde...", false, true);*/
			dialogHandler.sendEmptyMessage(0);
			File file = new File(diretorioAndroid);  
			File file2 = new File(diretorioAndroid + arquivoFTP); 
			Log.v(TAG, "uploadFTP - Atribuidas as variáveis"); 
			String status = "";
			if (file.isDirectory()) {  
				Log.v(TAG,"uploadFTP - é diretório"); 
				if(file.list().length > 0){ 
					Log.v(TAG,"uploadFTP - file.list().length > 0"); 

					ftp.connect(ipFTP);  
					ftp.login(loginFTP, senhaFTP);  
					ftp.enterLocalPassiveMode();  
					ftp.setFileTransferMode(FTPClient.ASCII_FILE_TYPE);  
					ftp.setFileType(FTPClient.ASCII_FILE_TYPE);  
					ftp.changeWorkingDirectory(diretorioFTP);  
					FileInputStream arqEnviar = new FileInputStream(diretorioAndroid + arquivoFTP);
					Log.v(TAG,"uploadFTP - FileInputStream declarado"); 
					if (ftp.storeFile(arquivoFTP, arqEnviar)) { 
						Log.v(TAG,"uploadFTP - ftp.storeFile(arquivoFTP, arqEnviar)");
						//TODO: retirado o logout opara parar o erro:ERRO FTP: org.apache.commons.net.ftp.FTPConnectionClosedException: Connection closed without indication. 
						//ftp.logout();  
						//ftp.disconnect();  
						status = ftp.getStatus().toString();
						Log.v(TAG,"uploadFTP - getStatus(): "+status); 

						if (file2.delete()) {  
							Log.i(TAG,"uploadFTP - Arquivo " + arquivoFTP + " excluído com sucesso");
							retorno = true;
							// return retorno;  
						} else {  
							Log.e(TAG,"uploadFTP - Erro ao excluir o arquivo " + arquivoFTP); 
							retorno = false;
							//return retorno;  
						}  

					} else {  
						//ftp.logout();  
						//ftp.disconnect();  
						Log.e(TAG,"uploadFTP - ERRO: arquivo " + arquivoFTP + "não foi enviado!"); 
						retorno = false;
						//  return retorno;  
					}

				}  
				else  
				{  
					Log.e(TAG,"uploadFTP - Não existe o arquivo " + arquivoFTP + "neste diretório!");  
					retorno = false;
					// return retorno;  
				}  
			}  
			else  
			{  
				Log.e(TAG,"uploadFTP - Não é diretório"); 
				retorno = false;
				// return retorno;  
			}  

			//status += ftp.getStatus();
			if (ftp.isConnected()){
				Log.v(TAG,"uploadFTP - isConnected ");
				//ftp.quit();
				//ftp.logout();  
				//ftp.disconnect();
				ftp.abort();
				status = ftp.getStatus().toString();
				Log.v(TAG,"uploadFTP - quit "+retorno);
			}



			return retorno;
		} catch (IOException e) {  
			Log.e(TAG,"uploadFTP - ERRO FTP: " + e); 
			retorno = false;
			return retorno;  
		} finally {
			//dialog.setMessage("Enviado");
			handler.sendEmptyMessage(0);
			//dialog.dismiss();
			//dialog.hide();
			Log.v(TAG,"uploadFTP - finally executado");  
		}

	}  

	@Override
	protected void onDestroy() {
		super.onDestroy();
		unRegisterBaseActivityReceiver();
		finish();
	}

}

